from enum import IntEnum
from typing import overload, NewType, Optional, Tuple

from OCC.Core.Standard import *
from OCC.Core.NCollection import *
from OCC.Core.Adaptor3d import *
from OCC.Core.TColStd import *
from OCC.Core.Adaptor2d import *
from OCC.Core.GeomAbs import *
from OCC.Core.Geom2d import *
from OCC.Core.Geom import *
from OCC.Core.AppCont import *
from OCC.Core.AppParCurves import *
from OCC.Core.TColgp import *
from OCC.Core.gp import *

class Approx_Array1OfAdHSurface:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, theLower: int, theUpper: int) -> None: ...
    def __getitem__(self, index: int) -> False: ...
    def __setitem__(self, index: int, value: False) -> None: ...
    def __len__(self) -> int: ...
    def __iter__(self) -> Iterator[False]: ...
    def next(self) -> False: ...
    __next__ = next
    def Init(self, theValue: False) -> None: ...
    def Size(self) -> int: ...
    def Length(self) -> int: ...
    def IsEmpty(self) -> bool: ...
    def Lower(self) -> int: ...
    def Upper(self) -> int: ...
    def IsDetectable(self) -> bool: ...
    def IsAllocated(self) -> bool: ...
    def First(self) -> False: ...
    def Last(self) -> False: ...
    def Value(self, theIndex: int) -> False: ...
    def SetValue(self, theIndex: int, theValue: False) -> None: ...

class Approx_Array1OfGTrsf2d:
    @overload
    def __init__(self) -> None: ...
    @overload
    def __init__(self, theLower: int, theUpper: int) -> None: ...
    def __getitem__(self, index: int) -> gp_GTrsf2d: ...
    def __setitem__(self, index: int, value: gp_GTrsf2d) -> None: ...
    def __len__(self) -> int: ...
    def __iter__(self) -> Iterator[gp_GTrsf2d]: ...
    def next(self) -> gp_GTrsf2d: ...
    __next__ = next
    def Init(self, theValue: gp_GTrsf2d) -> None: ...
    def Size(self) -> int: ...
    def Length(self) -> int: ...
    def IsEmpty(self) -> bool: ...
    def Lower(self) -> int: ...
    def Upper(self) -> int: ...
    def IsDetectable(self) -> bool: ...
    def IsAllocated(self) -> bool: ...
    def First(self) -> gp_GTrsf2d: ...
    def Last(self) -> gp_GTrsf2d: ...
    def Value(self, theIndex: int) -> gp_GTrsf2d: ...
    def SetValue(self, theIndex: int, theValue: gp_GTrsf2d) -> None: ...

class Approx_SequenceOfHArray1OfReal:
    def Assign(self, theItem: False) -> False: ...
    def Clear(self) -> None: ...
    def First(self) -> False: ...
    def IsDeletables(self) -> bool: ...
    def IsEmpty(self) -> bool: ...
    def Last(self) -> False: ...
    def Length(self) -> int: ...
    def Lower(self) -> int: ...
    def Prepend(self, theItem: False) -> False: ...
    def RemoveFirst(self) -> None: ...
    def Reverse(self) -> None: ...
    def SetValue(self, theIndex: int, theValue: False) -> None: ...
    def Size(self) -> int: ...
    def UpdateUpperBound(self, int) -> None: ...
    def UpdateLowerBound(self, int) -> None: ...
    def Upper(self) -> int: ...
    def Value(self, theIndex: int) -> False: ...
    def __init__(self) -> None: ...
    def __len__(self) -> int: ...

class Approx_ParametrizationType(IntEnum):
    Approx_ChordLength: int = ...
    Approx_Centripetal: int = ...
    Approx_IsoParametric: int = ...

Approx_ChordLength = Approx_ParametrizationType.Approx_ChordLength
Approx_Centripetal = Approx_ParametrizationType.Approx_Centripetal
Approx_IsoParametric = Approx_ParametrizationType.Approx_IsoParametric

class Approx_Status(IntEnum):
    Approx_PointsAdded: int = ...
    Approx_NoPointsAdded: int = ...
    Approx_NoApproximation: int = ...

Approx_PointsAdded = Approx_Status.Approx_PointsAdded
Approx_NoPointsAdded = Approx_Status.Approx_NoPointsAdded
Approx_NoApproximation = Approx_Status.Approx_NoApproximation

class Approx_Curve2d:
    def __init__(
        self,
        C2D: Adaptor2d_Curve2d,
        First: float,
        Last: float,
        TolU: float,
        TolV: float,
        Continuity: GeomAbs_Shape,
        MaxDegree: int,
        MaxSegments: int,
    ) -> None: ...
    def Curve(self) -> Geom2d_BSplineCurve: ...
    def HasResult(self) -> bool: ...
    def IsDone(self) -> bool: ...
    def MaxError2dU(self) -> float: ...
    def MaxError2dV(self) -> float: ...

class Approx_Curve3d:
    def __init__(
        self,
        Curve: Adaptor3d_Curve,
        Tol3d: float,
        Order: GeomAbs_Shape,
        MaxSegments: int,
        MaxDegree: int,
    ) -> None: ...
    def Curve(self) -> Geom_BSplineCurve: ...
    def Dump(self) -> str: ...
    def HasResult(self) -> bool: ...
    def IsDone(self) -> bool: ...
    def MaxError(self) -> float: ...

class Approx_CurveOnSurface:
    @overload
    def __init__(
        self,
        C2D: Adaptor2d_Curve2d,
        Surf: Adaptor3d_Surface,
        First: float,
        Last: float,
        Tol: float,
        Continuity: GeomAbs_Shape,
        MaxDegree: int,
        MaxSegments: int,
        Only3d: Optional[bool] = False,
        Only2d: Optional[bool] = False,
    ) -> None: ...
    @overload
    def __init__(
        self,
        theC2D: Adaptor2d_Curve2d,
        theSurf: Adaptor3d_Surface,
        theFirst: float,
        theLast: float,
        theTol: float,
    ) -> None: ...
    def Curve2d(self) -> Geom2d_BSplineCurve: ...
    def Curve3d(self) -> Geom_BSplineCurve: ...
    def HasResult(self) -> bool: ...
    def IsDone(self) -> bool: ...
    def MaxError2dU(self) -> float: ...
    def MaxError2dV(self) -> float: ...
    def MaxError3d(self) -> float: ...
    def Perform(
        self,
        theMaxSegments: int,
        theMaxDegree: int,
        theContinuity: GeomAbs_Shape,
        theOnly3d: Optional[bool] = False,
        theOnly2d: Optional[bool] = False,
    ) -> None: ...

class Approx_CurvilinearParameter:
    @overload
    def __init__(
        self,
        C3D: Adaptor3d_Curve,
        Tol: float,
        Order: GeomAbs_Shape,
        MaxDegree: int,
        MaxSegments: int,
    ) -> None: ...
    @overload
    def __init__(
        self,
        C2D: Adaptor2d_Curve2d,
        Surf: Adaptor3d_Surface,
        Tol: float,
        Order: GeomAbs_Shape,
        MaxDegree: int,
        MaxSegments: int,
    ) -> None: ...
    @overload
    def __init__(
        self,
        C2D1: Adaptor2d_Curve2d,
        Surf1: Adaptor3d_Surface,
        C2D2: Adaptor2d_Curve2d,
        Surf2: Adaptor3d_Surface,
        Tol: float,
        Order: GeomAbs_Shape,
        MaxDegree: int,
        MaxSegments: int,
    ) -> None: ...
    def Curve2d1(self) -> Geom2d_BSplineCurve: ...
    def Curve2d2(self) -> Geom2d_BSplineCurve: ...
    def Curve3d(self) -> Geom_BSplineCurve: ...
    def Dump(self) -> str: ...
    def HasResult(self) -> bool: ...
    def IsDone(self) -> bool: ...
    def MaxError2d1(self) -> float: ...
    def MaxError2d2(self) -> float: ...
    def MaxError3d(self) -> float: ...

class Approx_CurvlinFunc(Standard_Transient):
    @overload
    def __init__(self, C: Adaptor3d_Curve, Tol: float) -> None: ...
    @overload
    def __init__(
        self, C2D: Adaptor2d_Curve2d, S: Adaptor3d_Surface, Tol: float
    ) -> None: ...
    @overload
    def __init__(
        self,
        C2D1: Adaptor2d_Curve2d,
        C2D2: Adaptor2d_Curve2d,
        S1: Adaptor3d_Surface,
        S2: Adaptor3d_Surface,
        Tol: float,
    ) -> None: ...
    def EvalCase1(self, S: float, Order: int, Result: TColStd_Array1OfReal) -> bool: ...
    def EvalCase2(self, S: float, Order: int, Result: TColStd_Array1OfReal) -> bool: ...
    def EvalCase3(self, S: float, Order: int, Result: TColStd_Array1OfReal) -> bool: ...
    def FirstParameter(self) -> float: ...
    def GetLength(self) -> float: ...
    def GetSParameter(self, U: float) -> float: ...
    def GetUParameter(
        self, C: Adaptor3d_Curve, S: float, NumberOfCurve: int
    ) -> float: ...
    def Intervals(self, T: TColStd_Array1OfReal, S: GeomAbs_Shape) -> None: ...
    def LastParameter(self) -> float: ...
    @overload
    def Length(self) -> None: ...
    @overload
    def Length(self, C: Adaptor3d_Curve, FirstU: float, LasrU: float) -> float: ...
    def NbIntervals(self, S: GeomAbs_Shape) -> int: ...
    def SetTol(self, Tol: float) -> None: ...
    def Trim(self, First: float, Last: float, Tol: float) -> None: ...

class Approx_FitAndDivide:
    @overload
    def __init__(
        self,
        Line: AppCont_Function,
        degreemin: Optional[int] = 3,
        degreemax: Optional[int] = 8,
        Tolerance3d: Optional[float] = 1.0e-5,
        Tolerance2d: Optional[float] = 1.0e-5,
        cutting: Optional[bool] = False,
        FirstC: Optional[AppParCurves_Constraint] = AppParCurves_TangencyPoint,
        LastC: Optional[AppParCurves_Constraint] = AppParCurves_TangencyPoint,
    ) -> None: ...
    @overload
    def __init__(
        self,
        degreemin: Optional[int] = 3,
        degreemax: Optional[int] = 8,
        Tolerance3d: Optional[float] = 1.0e-05,
        Tolerance2d: Optional[float] = 1.0e-05,
        cutting: Optional[bool] = False,
        FirstC: Optional[AppParCurves_Constraint] = AppParCurves_TangencyPoint,
        LastC: Optional[AppParCurves_Constraint] = AppParCurves_TangencyPoint,
    ) -> None: ...
    def Error(self, Index: int) -> Tuple[float, float]: ...
    def IsAllApproximated(self) -> bool: ...
    def IsToleranceReached(self) -> bool: ...
    def NbMultiCurves(self) -> int: ...
    def Parameters(self, Index: int) -> Tuple[float, float]: ...
    def Perform(self, Line: AppCont_Function) -> None: ...
    def SetConstraints(
        self, FirstC: AppParCurves_Constraint, LastC: AppParCurves_Constraint
    ) -> None: ...
    def SetDegrees(self, degreemin: int, degreemax: int) -> None: ...
    def SetHangChecking(self, theHangChecking: bool) -> None: ...
    def SetInvOrder(self, theInvOrder: bool) -> None: ...
    def SetMaxSegments(self, theMaxSegments: int) -> None: ...
    def SetTolerances(self, Tolerance3d: float, Tolerance2d: float) -> None: ...
    def Value(self, Index: Optional[int] = 1) -> AppParCurves_MultiCurve: ...

class Approx_FitAndDivide2d:
    @overload
    def __init__(
        self,
        Line: AppCont_Function,
        degreemin: Optional[int] = 3,
        degreemax: Optional[int] = 8,
        Tolerance3d: Optional[float] = 1.0e-5,
        Tolerance2d: Optional[float] = 1.0e-5,
        cutting: Optional[bool] = False,
        FirstC: Optional[AppParCurves_Constraint] = AppParCurves_TangencyPoint,
        LastC: Optional[AppParCurves_Constraint] = AppParCurves_TangencyPoint,
    ) -> None: ...
    @overload
    def __init__(
        self,
        degreemin: Optional[int] = 3,
        degreemax: Optional[int] = 8,
        Tolerance3d: Optional[float] = 1.0e-05,
        Tolerance2d: Optional[float] = 1.0e-05,
        cutting: Optional[bool] = False,
        FirstC: Optional[AppParCurves_Constraint] = AppParCurves_TangencyPoint,
        LastC: Optional[AppParCurves_Constraint] = AppParCurves_TangencyPoint,
    ) -> None: ...
    def Error(self, Index: int) -> Tuple[float, float]: ...
    def IsAllApproximated(self) -> bool: ...
    def IsToleranceReached(self) -> bool: ...
    def NbMultiCurves(self) -> int: ...
    def Parameters(self, Index: int) -> Tuple[float, float]: ...
    def Perform(self, Line: AppCont_Function) -> None: ...
    def SetConstraints(
        self, FirstC: AppParCurves_Constraint, LastC: AppParCurves_Constraint
    ) -> None: ...
    def SetDegrees(self, degreemin: int, degreemax: int) -> None: ...
    def SetHangChecking(self, theHangChecking: bool) -> None: ...
    def SetInvOrder(self, theInvOrder: bool) -> None: ...
    def SetMaxSegments(self, theMaxSegments: int) -> None: ...
    def SetTolerances(self, Tolerance3d: float, Tolerance2d: float) -> None: ...
    def Value(self, Index: Optional[int] = 1) -> AppParCurves_MultiCurve: ...

class Approx_MCurvesToBSpCurve:
    def __init__(self) -> None: ...
    def Append(self, MC: AppParCurves_MultiCurve) -> None: ...
    def ChangeValue(self) -> AppParCurves_MultiBSpCurve: ...
    @overload
    def Perform(self) -> None: ...
    @overload
    def Perform(self, TheSeq: AppParCurves_SequenceOfMultiCurve) -> None: ...
    def Reset(self) -> None: ...
    def Value(self) -> AppParCurves_MultiBSpCurve: ...

class Approx_SameParameter:
    @overload
    def __init__(
        self, C3D: Geom_Curve, C2D: Geom2d_Curve, S: Geom_Surface, Tol: float
    ) -> None: ...
    @overload
    def __init__(
        self, C3D: Adaptor3d_Curve, C2D: Geom2d_Curve, S: Adaptor3d_Surface, Tol: float
    ) -> None: ...
    @overload
    def __init__(
        self,
        C3D: Adaptor3d_Curve,
        C2D: Adaptor2d_Curve2d,
        S: Adaptor3d_Surface,
        Tol: float,
    ) -> None: ...
    def Curve2d(self) -> Geom2d_Curve: ...
    def Curve3d(self) -> Adaptor3d_Curve: ...
    def CurveOnSurface(self) -> Adaptor3d_CurveOnSurface: ...
    def IsDone(self) -> bool: ...
    def IsSameParameter(self) -> bool: ...
    def TolReached(self) -> float: ...

class Approx_SweepApproximation:
    def __init__(self, Func: Approx_SweepFunction) -> None: ...
    def Average2dError(self, Index: int) -> float: ...
    def AverageErrorOnSurf(self) -> float: ...
    def Curve2d(
        self,
        Index: int,
        TPoles: TColgp_Array1OfPnt2d,
        TKnots: TColStd_Array1OfReal,
        TMults: TColStd_Array1OfInteger,
    ) -> None: ...
    def Curve2dPoles(self, Index: int) -> TColgp_Array1OfPnt2d: ...
    def Curves2dDegree(self) -> int: ...
    def Curves2dKnots(self) -> TColStd_Array1OfReal: ...
    def Curves2dMults(self) -> TColStd_Array1OfInteger: ...
    def Curves2dShape(self) -> Tuple[int, int, int]: ...
    def Dump(self) -> str: ...
    def Eval(
        self, Parameter: float, DerivativeRequest: int, First: float, Last: float
    ) -> Tuple[int, float]: ...
    def IsDone(self) -> bool: ...
    def Max2dError(self, Index: int) -> float: ...
    def MaxErrorOnSurf(self) -> float: ...
    def NbCurves2d(self) -> int: ...
    def Perform(
        self,
        First: float,
        Last: float,
        Tol3d: float,
        BoundTol: float,
        Tol2d: float,
        TolAngular: float,
        Continuity: Optional[GeomAbs_Shape] = GeomAbs_C0,
        Degmax: Optional[int] = 11,
        Segmax: Optional[int] = 50,
    ) -> None: ...
    def SurfPoles(self) -> TColgp_Array2OfPnt: ...
    def SurfShape(self) -> Tuple[int, int, int, int, int, int]: ...
    def SurfUKnots(self) -> TColStd_Array1OfReal: ...
    def SurfUMults(self) -> TColStd_Array1OfInteger: ...
    def SurfVKnots(self) -> TColStd_Array1OfReal: ...
    def SurfVMults(self) -> TColStd_Array1OfInteger: ...
    def SurfWeights(self) -> TColStd_Array2OfReal: ...
    def Surface(
        self,
        TPoles: TColgp_Array2OfPnt,
        TWeights: TColStd_Array2OfReal,
        TUKnots: TColStd_Array1OfReal,
        TVKnots: TColStd_Array1OfReal,
        TUMults: TColStd_Array1OfInteger,
        TVMults: TColStd_Array1OfInteger,
    ) -> None: ...
    def TolCurveOnSurf(self, Index: int) -> float: ...
    def UDegree(self) -> int: ...
    def VDegree(self) -> int: ...

class Approx_SweepFunction(Standard_Transient):
    def BarycentreOfSurf(self) -> gp_Pnt: ...
    def D0(
        self,
        Param: float,
        First: float,
        Last: float,
        Poles: TColgp_Array1OfPnt,
        Poles2d: TColgp_Array1OfPnt2d,
        Weigths: TColStd_Array1OfReal,
    ) -> bool: ...
    def D1(
        self,
        Param: float,
        First: float,
        Last: float,
        Poles: TColgp_Array1OfPnt,
        DPoles: TColgp_Array1OfVec,
        Poles2d: TColgp_Array1OfPnt2d,
        DPoles2d: TColgp_Array1OfVec2d,
        Weigths: TColStd_Array1OfReal,
        DWeigths: TColStd_Array1OfReal,
    ) -> bool: ...
    def D2(
        self,
        Param: float,
        First: float,
        Last: float,
        Poles: TColgp_Array1OfPnt,
        DPoles: TColgp_Array1OfVec,
        D2Poles: TColgp_Array1OfVec,
        Poles2d: TColgp_Array1OfPnt2d,
        DPoles2d: TColgp_Array1OfVec2d,
        D2Poles2d: TColgp_Array1OfVec2d,
        Weigths: TColStd_Array1OfReal,
        DWeigths: TColStd_Array1OfReal,
        D2Weigths: TColStd_Array1OfReal,
    ) -> bool: ...
    def GetMinimalWeight(self, Weigths: TColStd_Array1OfReal) -> None: ...
    def GetTolerance(
        self,
        BoundTol: float,
        SurfTol: float,
        AngleTol: float,
        Tol3d: TColStd_Array1OfReal,
    ) -> None: ...
    def Intervals(self, T: TColStd_Array1OfReal, S: GeomAbs_Shape) -> None: ...
    def IsRational(self) -> bool: ...
    def Knots(self, TKnots: TColStd_Array1OfReal) -> None: ...
    def MaximalSection(self) -> float: ...
    def Mults(self, TMults: TColStd_Array1OfInteger) -> None: ...
    def Nb2dCurves(self) -> int: ...
    def NbIntervals(self, S: GeomAbs_Shape) -> int: ...
    def Resolution(self, Index: int, Tol: float) -> Tuple[float, float]: ...
    def SectionShape(self) -> Tuple[int, int, int]: ...
    def SetInterval(self, First: float, Last: float) -> None: ...
    def SetTolerance(self, Tol3d: float, Tol2d: float) -> None: ...

# harray1 classes

class Approx_HArray1OfAdHSurface(Approx_Array1OfAdHSurface, Standard_Transient):
    def __init__(self, theLower: int, theUpper: int) -> None: ...
    def Array1(self) -> Approx_Array1OfAdHSurface: ...

class Approx_HArray1OfGTrsf2d(Approx_Array1OfGTrsf2d, Standard_Transient):
    def __init__(self, theLower: int, theUpper: int) -> None: ...
    def Array1(self) -> Approx_Array1OfGTrsf2d: ...

# harray2 classes
# hsequence classes
